package com.mycms.architecture.jsf.component;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;

import org.jboss.seam.Component;
import org.jboss.seam.ui.util.HTML;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mycms.architecture.utility.StringUtility;

public class HtmlStyleSheet extends MyCMSUIComponent
{
	private Logger tracer = LoggerFactory.getLogger(getClass());

	/** tag "link" */
	private static final String LINK_TAG = "link";

	/** nome relativo del foglio di stile */
	private String name;

	/** url base per i fogli di stile */
	private String base;

	/**
	 * Rende il nome del relativo del foglio di stile.
	 * 
	 * @return nome css.
	 */
	public String getName()
	{
		if (name != null)
			return name;
		else
			return resolveBinding("name", String.class);
	}

	/**
	 * Imposta il nome del relativo del foglio di stile.
	 * 
	 * @param name nuovo valore per il campo name.
	 */
	public void setName(String name)
	{
		this.name = name;
	}

	/**
	 * Rende l'url base dei fogli di stile.
	 * 
	 * @return il campo base.
	 */
	public String getBase()
	{
		if (base != null)
			return base;
		else
			return resolveBinding("base", String.class);
	}

	/**
	 * Imposta l'url base dei fogli di stile.
	 * 
	 * @param baseurl nuovo valore per il campo base.
	 */
	public void setBase(String baseurl)
	{
		this.base = baseurl;
	}

	/*
	 * (non-Javadoc)
	 * @see
	 * javax.faces.component.UIComponentBase#encodeBegin(javax.faces.context.FacesContext)
	 */
	@Override
	public void encodeBegin(FacesContext context) throws IOException
	{
		/*
		 * viene usato encodeBegin() invece di encodeAll() perch� sembra che se il
		 * componente � un figlio di un s:fragment encodeAll() non venga mai chiamato
		 */

		// non fare rendering se � richiesto che il componente sia nascosto
		if ( !isRendered())
			return;

		// se nome vuoto non fa nulla (ma avvisa)
		if (StringUtility.isEmptyStringOrNull(getName()))
		{
			tracer.error("Foglio di stile con nome mancante o vuoto; non verra' generato alcun tag link");
			return;
		}

/*		final Profile profilo = (Profile) Component.getInstance(Profile.COMPONENT_NAME);
*/		Locale seamLocale = org.jboss.seam.core.Locale.instance();
		String lingua = seamLocale.getLanguage();

		UrlResolver urlResolver = (UrlResolver) Component.getInstance(UrlResolver.COMPONENT_NAME);
		/*
		 * (usiamo la versione con i domini e la lingua espliciti perch� � possibile
		 * effettuare un override dei domini)
		 */
		List<String> links = urlResolver.resolveMultipleUrls(getBase(), getName(), true,
				context, lingua);

		if ( !links.isEmpty())
		{
			ResponseWriter w = context.getResponseWriter();

			for (String link : links)
			{
				w.startElement(LINK_TAG, this);

				w.writeAttribute(HTML.REL_ATTR, "stylesheet", HTML.REL_ATTR);
				w.writeAttribute(HTML.TYPE_ATTR, "text/css", HTML.TYPE_ATTR);
				w.writeAttribute(HTML.HREF_ATTR, link, HTML.HREF_ATTR);
				HTML.renderHTMLAttributes(w, this, HTML.IMG_PASSTHROUGH_ATTRIBUTES);
				w.endElement(LINK_TAG);
			}
		}
		else
		{
			tracer.error(
					"Nessun foglio di stile trovato con base=\"{}\" e name=\"{}\" nella webroot; non verra' generato il tag per linkare lo stile",
					base, name);
		}
	}

	/*
	 * (non-Javadoc)
	 * @see javax.faces.component.UIComponentBase#getRendersChildren()
	 */
	@Override
	public boolean getRendersChildren()
	{
		// questo componente non pu� avere figli
		return false;
	}

	/*
	 * (non-Javadoc)
	 * @see javax.faces.component.UIComponent#getFamily()
	 */
	@Override
	public String getFamily()
	{
		return null;
	}

	/**
	 * variabile di supporto per il salvataggio/recupero dello stato in modo efficiente;
	 * sistema copiato dai sorgenti di mojarra
	 */
	private Object[] values;

	/*
	 * (non-Javadoc)
	 * @see
	 * javax.faces.component.UIComponentBase#saveState(javax.faces.context.FacesContext)
	 */
	@Override
	public Object saveState(FacesContext context)
	{
		if (values == null)
		{
			values = new Object[8];
		}

		values[0] = super.saveState(context);
		values[1] = base;
		values[2] = name;
		return (values);
	}

	/*
	 * (non-Javadoc)
	 * @see
	 * javax.faces.component.UIComponentBase#restoreState(javax.faces.context.FacesContext
	 * , java.lang.Object)
	 */
	@Override
	public void restoreState(FacesContext context, Object state)
	{
		values = (Object[]) state;
		super.restoreState(context, values[0]);
		base = (String) values[1];
		name = (String) values[2];
	}

}